const http = require("http");
const fs = require("fs");
const url = require("url");
const qs = require("querystring");

// 设定路由规则：
    // 数据请求：http://localhost:3000/api
    // 静态资源请求：http://localhost:3000/

http.createServer((req, res)=>{

    // const str = "http://localhost:3000" + req.url;
    // console.log(new URL(str));

    // console.log(url.parse(req.url));

    if(req.url.includes("/api")){
        dataHandle(req, res);
    }else{
        staticHandle(req, res);
    }

}).listen(3000,()=>{
    console.log("服务器开启成功: http://localhost:3000")
})

function dataHandle(req, res){
    // get数据：在地址后拼接
    // const str = req.url.split("?")[1];
    // const obj = parse(str);
    // console.log(obj);

    // post数据：非地址后拼接
    // 只能通过事件获取
    // 绑定事件：req.on(事件类型,事件处理函数)
    // data事件根据数据大小，有可能多次执行，每次只能拿到部分数据，所以data事件每次执行，都需要先将数据拼接起来
    // let str = "";
    // req.on("data",(d)=>{
    //     str += d;
    // })
    // // end事件绝对会在最后一个data之后执行，所以在end中获取拼接之后的数据，绝对是完整数据
    // req.on("end", ()=>{
    //     console.log(str);
    //     // 解析数据
    //     const obj = parse(str);
    //     console.log(obj);
    // })

    // 根据前端请求方式，决定解析get数据或post数据
    if(req.method === "GET"){
        const obj = url.parse(req.url, true).query;
        fn(req, res, obj);
    }else if(req.method === "POST"){
        let str = "";
        req.on("data",(d)=>{
            str += d;
        })
        req.on("end", ()=>{
            const obj = qs.parse(str);
            fn(req, res, obj);
        })
    }
}

function fn(req, res, data){
    // 此处可以拿到前端请求时携带的数据
    console.log(data);
    // 之后就可以开始具体的功能处理
    res.end();
}


function staticHandle(req, res){
    // console.log(req.url);
    // 解析url，绝对找到pathname部分，再读取文件
    fs.readFile("./www" + url.parse(req.url).pathname, (err, data)=>{
        if(err){
            res.write("404");
        }else{
            res.write(data);
        }
        res.end();
    })
}


